import xml.etree.ElementTree as ET
import os
import time

def parse_xml_with_depth_limit(xml_file, max_depth, output_file=None):
    """
    解析XML元素层级并输出结果，可选择保存到文件
    
    参数:
    xml_file -- XML文件路径
    max_depth -- 最大显示深度
    output_file -- 可选参数，输出文件路径
    """
    try:
        # 解析XML文件
        tree = ET.parse(xml_file)
        root = tree.getroot()
        
        # 获取文件名（不包含扩展名）
        xml_name = os.path.splitext(os.path.basename(xml_file))[0]
        
        # 创建结果容器
        results = []
        
        # 添加报告标题
        results.append(f"XML元素层级分析报告")
        results.append(f"文件: {os.path.basename(xml_file)}")
        results.append(f"分析时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
        results.append(f"最大显示深度: {max_depth}")
        results.append(f"根元素: {root.tag}\n")
        
        # 递归处理XML元素
        def process_element(element, current_depth, path=""):
            # 构建当前元素的路径
            tag = element.tag
            current_path = f"{path}/{tag}" if path else tag
            
            # 深度未超限：显示元素路径
            if current_depth <= max_depth:
                line = f"{'│   ' * (current_depth - 1)}├─ {tag}" if current_depth > 0 else tag
                elem_info = [line]
            else:
                # 深度超限：仅返回占位符
                return ["│   " * max_depth + "└─ ..."]
            
            # 处理子元素
            children = list(element)
            children_counter = {}
            
            for child in children:
                # 统计子元素类型
                child_tag = child.tag
                children_counter[child_tag] = children_counter.get(child_tag, 0) + 1
                
                child_results = process_element(child, current_depth + 1, current_path)
                elem_info.extend(child_results)
            
            # 添加统计信息
            if current_depth <= max_depth and children:
                count_info = ", ".join([f"{k}({v})" for k, v in children_counter.items()])
                indent = "│   " * current_depth
                elem_info.append(f"{indent}    [子元素统计: {len(children)}个 ({count_info})]")
            
            return elem_info

        # 获取处理结果
        results.extend(process_element(root, 0))
        
        # 添加结束分隔线
        results.append("\n" + "=" * 60)
        results.append(f"说明：深度 > {max_depth} 的元素被聚合显示为 '...'")
        
        # 结果输出处理
        output_text = "\n".join(results)
        
        if output_file:
            # 确保输出目录存在
            os.makedirs(os.path.dirname(output_file), exist_ok=True)
            
            # 写入文件
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(output_text)
            print(f"分析结果已保存至: {os.path.abspath(output_file)}")
        else:
            # 输出到控制台
            print(output_text)
        
        return True
    
    except Exception as e:
        error_msg = f"处理XML文件时出错: {str(e)}"
        if output_file:
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(error_msg)
        print(error_msg)
        return False

# 使用示例
if __name__ == "__main__":
    # 配置参数
    xml_path = r"cwec_latest\cwec_v4.17.xml"  # XML文件路径
    depth = 1                 # 最大显示深度
    output_path = r"cwec_latest/xml_analysis_report_dp1.txt"  # 输出文件路径
    
    # 执行解析
    parse_xml_with_depth_limit(xml_path, depth, output_path)